﻿using Furion;
using edan.zhjk.Commons.Exceptions;
using edan.zhjk.Commons.MCPService.Files;
using edan.zhjk.Commons.MCPService.VirtuosoDB;
using edan.zhjk.Commons.MCPService.PostgreSQLDB;
using edan.zhjk.Commons.MCPService.MySqlDB;
using edan.zhjk.Commons.MCPService.SqlServerDB;

namespace edan.zhjk.MCPWebApi
{
    /// <summary>
    /// 启动类
    /// </summary>
    public class WebStartup : AppStartup
    {
        /// <summary>
        /// 服务组件注入
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {
            // 配置跨域
            services.AddCorsAccessor();

            // 控制器注入 
            services.AddControllers()
            .AddNewtonsoftJson(options =>
            {
                // 时间格式化
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            });

            //注册MCPServer，并从当前程序集加载Tool
            services
                //将模型上下文协议（MCP）服务器添加到服务集合中，并采用默认选项
                .AddMcpServer()
                // 添加标准输入输出传输支持
                //此方法会将服务器配置为通过标准输入和输出流进行通信，这种配置方式通常在客户端进程本地启动模型上下文协议服务器时使用。
                .WithHttpTransport()
                //此方法会遍历VirtuosoTools类中的所有实例方法和静态方法（包括公共方法和非公共方法），这些方法都被标记为 <see cref="McpServerToolAttribute"/> ，然后为每个方法添加一个 <see cref="McpServerTool"/> 实例。对于实例方法，每次调用工具时都会为该方法构建一个实例。
                .WithTools<FileTool>()
                .WithTools<PostgreSQLDBTool>()
                .WithTools<MySqlDBTool>()
                .WithTools<SqlServerDBTool>()
                .WithTools<VirtuosoDBTool>();

            // 在Program.cs中注册HttpClient
            services.AddHttpClient("ChromaClient", client =>
            {
                client.BaseAddress = new Uri("http://localhost:8000");
            });

            // Furion注入
            services.AddInject();

            // 注册全局异常捕获
            GlobalExceptionHandler.RegisterGlobalException();
        }

        /// <summary>
        /// 中间件配置注入
        /// </summary>
        /// <param name="app"></param>
        /// <param name="env"></param>
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();

            // 跨域
            app.UseCorsAccessor();

            // 加载Furion框架
            app.UseInject(string.Empty);

            app.UseEndpoints(endpoints =>
            {
                //注册控制器
                endpoints.MapControllers();

                //注册MCPServer的路由
                endpoints.MapMcp();
            });
        }
    }
}
